perm filename PCHECK.MSG[CHE,WD]1 blob sn#023935 filedate 1973-02-06 generic text, type T, neo UTF8
BEGIN

EVAL '(DECLARE (DECIMAL) (SPECIAL AXIOMS CURLIN CURPRF PROOFS SCHEMAS THEOREMS) (SPECIAL LOGICALCONSTANTS 
	QUANTIFIERS) (SPECIAL EXPEXP EXPLGTH EXPLIM ORDCNT) (SPECIAL CONSOLEWIDTH DDWIDTH FILEWIDTH IIIWIDTH 
	IMLACWIDTH TTYWIDTH) (SPECIAL ?*FILEPRINT PRECLIS?* ?*PRINT ?*TWODIM));


MACRO FIRSTPROP (L);
	'CDR CONS CDR L;


MACRO LASTPROP (L);
	'NULL CONS CDR L;


MACRO NEXTPROP (L);
	'CDDR CONS CDR L;


MACRO PROPNAM (L);
	'CAR CONS CDR L;


MACRO PROPTABLE (L);
	'CDR CONS CDR L;


MACRO PROPVAL (L);
	'CADR CONS CDR L;


EXPR DELETEPROP (IDENT, PROPNAM);
	BEGIN
	NEW TEM;
	TEM ← IDENT;
LOOP; 	IF NULL CDR TEM THEN RETURN NIL;
	IF TEM[2] EQ PROPNAM THEN RETURN PROG2(RPLACD(TEM, CDDDR TEM), T);
	TEM ← CDDR TEM;
	GO LOOP;
	END;


EXPR GETGET (ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                 , PROP);
	BEGIN
	NEW TEM, PTAB;
	PTAB ← CDR ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                       ;
LOOP; 	IF NULL PTAB THEN RETURN NIL;
	TEM ← SEEKPROP(CAR PTAB, PROP);
	IF ¬NULL TEM THEN RETURN TEM;
	PTAB ← CDDR PTAB;
	GO LOOP;
	END;


EXPR INITPROP (IDENT, VALUE, NAME);
	RPLACD(IDENT, NAME CONS VALUE CONS CDR IDENT);


EXPR SEEKPROP (IDENT, PROPNAM);
	BEGIN
	NEW TEM;
	TEM ← GETL(IDENT, <PROPNAM>);
	IF NULL TEM THEN RETURN NIL;
	RETURN TEM;
	END;


FEXPR AE (ARGS);
	BEGIN
	NEW WFF;
	WFF ← WFFPART(CAR ARGS);
	IF CAR WFF ≠ 'AND THEN ERREND('(FIRST ARG IS NOT AN AND));
	ADDLINE(ANDELIM1(WFF, CDR ARGS), 'AE CONS ARGS, ASSPART(CAR ARGS));
	END;


FEXPR AI (ARGS);
	ADDLINE(CONJOIN(WFFLIST(ARGS)), 'AI CONS ARGS, UNION(ASSLIST(ARGS)));


FEXPR ALT (ARGS);
	BEGIN
	NEW NEWEXP;
	NEWEXP ← ALT1(WFFPART(CAR ARGS), WFFPART(ARGS[2]));
	IF ¬VALID(NEWEXP) THEN ERREND('(LINES ARE NOT ALTERNATIVES));
	ADDLINE(NEWEXP, <'ALT CONS ARGS>, UNION2(ASSPART(CAR ARGS), ASSPART(ARGS[2])));
	END;


FEXPR ASS (PROP);
	ADDLINE(CAR PROP, 'ASS CONS PROP, <NEXTLINE()>);


FEXPR BS (ARGS);
	ADDLINE(BOUNDSUBST(WFFPART(CAR ARGS), MAKECONSES(CDR ARGS), NIL), 'BS CONS ARGS, ASSPART(CAR ARGS));


FEXPR DED (LINES);
	BEGIN
	IF NULL LINES THEN ERREND('(NOTHING TO CONCLUDE));
	ADDLINE(<'IMPLIES, CONJOIN(WFFLIST(CDR LINES)), WFFPART(CAR LINES)>, 'DED CONS LINES, SETDIF(ASSPART(
		CAR LINES), CDR LINES));
	END;


FEXPR DEF (ARGS);
	BEGIN
	IF ¬ATOM CAR ARGS THEN ERREND('(NAMES MUST BE ATOMS));
	ADDLINE('SETQ CONS ARGS, 'DEF CONS ARGS, <NEXTLINE()>);
	END;


FEXPR DNE (LINE);
	BEGIN
	NEW NEWSTAT;
	IF ¬VALID(NEWSTAT ← DOUBLENEG(WFFPART(CAR LINE))) THEN ERREND('(NO DOUBLE NEGATIVE));
	ADDLINE(NEWSTAT, 'DNE CONS LINE, ASSPART(CAR LINE));
	END;


FEXPR DNI (LINE);
	ADDLINE(<'NOT, <'NOT, WFFPART(CAR LINE)>>, 'DNI CONS LINE, ASSPART(CAR LINE));


FEXPR EG (ARGS);
	ADDLINE(EXGEN1(WFFPART(CAR ARGS), CDR ARGS), 'EG CONS ARGS, ASSPART(CAR ARGS));


FEXPR ELIM (ARGS);
	BEGIN
	NEW NEW
*** WARNING, MLISP RESERVED WORD:  NEW
               ;
	NEW
*** WARNING, MLISP RESERVED WORD:  NEW
            ← WFFPART(ARGS[2]);
	IF CAR NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                   ≠ 'SETQ THEN ERREND('(NO DEFINITION));
	ADDLINE(SUBST(NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                         [3], NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                                 [2], WFFPART(CAR ARGS)), 'ELIM CONS ARGS, SETDIF(ASSPART(CAR ARGS), ASSPART(
		ARGS[2])));
	END;


FEXPR EQE (ARGS);
	BEGIN
	NEW NEW
*** WARNING, MLISP RESERVED WORD:  NEW
               ;
	NEW
*** WARNING, MLISP RESERVED WORD:  NEW
            ← WFFPART(CAR ARGS);
	IF CAR NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                   ≠ 'EQUIVALENT THEN ERREND('(NO EQUIVALENCE));
	NEW
*** WARNING, MLISP RESERVED WORD:  NEW
            ← 	IF ARGS[2] = 2 THEN REVERSE CDR NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                                                   
		ELSE CDR NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                            ;
	ADDLINE('IMPLIES CONS NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                                 , 'EQE CONS ARGS, ASSPART(CAR ARGS));
	END;


FEXPR EQI (ARGS);
	BEGIN
	NEW NEW
*** WARNING, MLISP RESERVED WORD:  NEW
               ;
	IF ¬VALID(NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                      ← EQI1(WFFPART(CAR ARGS), WFFPART(CAR ARGS))) THEN ERREND('(ARE NOT EQUIVALENT));
	ADDLINE(NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                   , 'EQI CONS ARGS, UNION2(ASSPART(CAR ARGS), ASSPART(ARGS[2])));
	END;


FEXPR ES (ARGS);
	ADDLINE(SPECALL(WFFPART(CAR ARGS), CDR ARGS), 'ES CONS ARGS, ASSPART(CAR ARGS));


FEXPR IFE (ARGS);
	BEGIN
	NEW NEW
*** WARNING, MLISP RESERVED WORD:  NEW
               ;
	IF ¬VALID(NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                      ← IFE1(WFFPART(CAR ARGS), WFFPART(ARGS[2]))) THEN 
		ERREND('(NO IF ?- THEN ?- ELSE EXPRESSION));
	ADDLINE(NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                   , 'IFE CONS ARGS, UNION2(ASSPART(CAR ARGS), ASSPART(ARGS[2])));
	END;


FEXPR IFI (ARGS);
	BEGIN
	NEW NEW
*** WARNING, MLISP RESERVED WORD:  NEW
               ;
	IF ¬VALID(NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                      ← IFI1(WFFPART(CAR ARGS), WFFPART(ARGS[2]))) THEN 
		ERREND('(NEED IMPLICATIONS WITH OPPOSITE ANTECEDENTS));
	ADDLINE(NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                   , 'IFI CONS ARGS, UNION2(ASSPART(CAR ARGS), ASSPART(ARGS[2])));
	END;


FEXPR LC (ARGS);
	ADDLINE(<'EQUAL, ARGS, LAMEXP(ARGS)>, 'LC CONS ARGS, NIL);


FEXPR MP (ARGS);
	BEGIN
	NEW NEWSTAT;
	IF ¬VALID(NEWSTAT ← MP1(WFFPART(CAR ARGS), WFFPART(ARGS[2]))) THEN 
		ERREND('(CANNOT MODUS PONENS));
	ADDLINE(NEWSTAT, 'MP CONS ARGS, UNION2(ASSPART(CAR ARGS), ASSPART(ARGS[2])));
	END;


FEXPR NE (ARGS);
	BEGIN
	IF ¬VALID(NOTELIM(WFFPART(CAR ARGS), WFFPART(ARGS[2]))) THEN ERREND('(NO CONTRADICTION));
	ADDLINE('FALSE, 'NE CONS ARGS, UNION2(ASSPART(CAR ARGS), ASSPART(ARGS[2])));
	END;


FEXPR NI (IM);
	BEGIN
	NEW NEWSTAT;
	IF ¬VALID(NEWSTAT ← NOTINTRO(WFFPART(CAR IM))) THEN ERREND('(NO IMPLIES FALSE));
	ADDLINE(NEWSTAT, 'NI CONS IM, ASSPART(CAR IM));
	END;


FEXPR OE (ARGS);
	BEGIN
	IF NULL ARGS | NULL CDR ARGS THEN ERREND('(NEED AT LEAST TWO ARGS));
	ADDLINE(ORELIM1(WFFPART(CAR ARGS), WFFLIST(CDR ARGS)), 'OE CONS ARGS, UNION(ASSLIST(ARGS)));
	END;


FEXPR OI (ARGS);
	BEGIN
	NEW KNOWN, SAVARGS, WFFS;
	SAVARGS ← ARGS;
LOOP; 	IF NULL ARGS THEN 
		IF NULL KNOWN THEN ERREND('(NO VALID PROPOSITION))
		ELSE GO ADDL;
	IF NUMBERP CAR ARGS THEN 
		(IF NULL KNOWN THEN KNOWN ← CAR ARGS);
	IF NUMBERP CAR ARGS THEN WFFS ← WFFPART(CAR ARGS) CONS WFFS
	ELSE WFFS ← CAR ARGS CONS WFFS;
	ARGS ← CDR ARGS;
	GO LOOP;
ADDL; 	ADDLINE(IF NULL CDR WFFS THEN CAR WFFS
		ELSE 'OR CONS REVERSE WFFS, 'OI CONS SAVARGS, ASSPART(KNOWN));
	END;


FEXPR REP (ARGS);
	BEGIN
	NEW NEW
*** WARNING, MLISP RESERVED WORD:  NEW
               ;
	NEW
*** WARNING, MLISP RESERVED WORD:  NEW
            ← WFFPART(ARGS[2]);
	IF ¬ISEQUIVALENCE(CAR NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                                 ) THEN ERREND('(NO EQUATION));
	NEW
*** WARNING, MLISP RESERVED WORD:  NEW
            ← 	IF ARGS[3] = 2 THEN REVERSE CDR NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                                                   
		ELSE CDR NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                            ;
	ADDLINE(SUBST(NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                         [2], CAR NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                                     , WFFPART(CAR ARGS)), 'REP CONS ARGS, UNION2(ASSPART(CAR ARGS), ASSPART(
		ARGS[2])));
	END;


FEXPR REPL (ARGS);
	ADDLINE(REPEITHER(WFFPART(CAR ARGS), WFFPART(ARGS[2]), T, ARGS[3]), 'REPL CONS ARGS, UNION2(ASSPART(CAR
		 ARGS), ASSPART(ARGS[2])));


FEXPR REPR (ARGS);
	ADDLINE(REPEITHER(WFFPART(CAR ARGS), WFFPART(ARGS[2]), NIL, ARGS[3]), 'REPR CONS ARGS, UNION2(ASSPART
		(CAR ARGS), ASSPART(ARGS[2])));


FEXPR TAUT (L);
	BEGIN
	IF ¬TH1(NIL, NIL, WFFLIST(CDR L), <CAR L>) THEN ERREND('(DOES NOT FOLLOW));
	ADDLINE(CAR L, 'TAUT CONS L, UNION(ASSLIST(CDR L)));
	END;


FEXPR UG (ARGS);
	BEGIN
	NEW ASS, VARS, WFF;
	WFF ← WFFPART(CAR ARGS);
	ASS ← ASSPART(CAR ARGS);
	VARS ← CDR ARGS;
LOOP; 	IF NULL VARS THEN GO ADDL;
	IF ATOM CAR VARS THEN GO ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                                     ;
	IF VARS[1,1] = 'CONS THEN GO DOT;
	ERREND('(ILLEGAL ARGUMENT));
ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
    ; 	WFF ← UNGEN(WFF, ASS, CAR VARS, CAR VARS);
	GO ELOOP;
DOT; 	WFF ← UNGEN(WFF, ASS, VARS[1,2], VARS[1,3]);
ELOOP; 	VARS ← CDR VARS;
	GO LOOP;
ADDL; 	ADDLINE(WFF, 'UG CONS ARGS, ASSPART(CAR ARGS));
	END;


FEXPR US (ARGS);
	BEGIN
	ADDLINE(SPECALL(WFFPART(CAR ARGS), CDR ARGS), 'US CONS ARGS, ASSPART(CAR ARGS));
	END;


FEXPR USEAX (ARGS);
	BEGIN
	NEW AX, FORM;
	AX ← GET(CAR ARGS, 'AXIOM);
	IF NULL AX THEN ERREND('(NO SUCH AXIOM));
	FORM ← SPECALL(AX, CDR ARGS);
	ADDLINE(FORM, 'USEAX CONS ARGS, NIL);
	END;


FEXPR USESCHM (ARGS);
	BEGIN
	NEW SCHEMA;
	SCHEMA ← GET(CAR ARGS, 'SCHEMA);
	IF NULL SCHEMA THEN ERREND('(IS NOT SCHEMA));
	ADDLINE(LAMEXP(PROPSUBST(ARGS[2], SCHEMA[1,2], SCHEMA[2])), 'USESCHM CONS ARGS, NIL);
	END;


FEXPR USETHM (ARGS);
	BEGIN
	NEW TH, FORM;
	TH ← GET(CAR ARGS, 'THEOREM);
	IF NULL TH THEN ERREND('(NO SUCH THEOREM));
	FORM ← SPECALL(TH, CDR ARGS);
	ADDLINE(FORM, 'USETHM CONS ARGS, NIL);
	END;


FEXPR BT (LINO);
	BEGIN
	NEW PROOF;
	LINO ← 	IF NULL LINO THEN CURLINE() - 1
		ELSE CAR LINO;
	PROOF ← CURTEXT();
	IF LINO ?*GREAT CURLINE() | LINO ?*LESS 0 THEN ERREND('(NON EXISTANT LINE));
	IF LINO = 0 THEN PUTPROP(CURPROOF(), NIL, 'PROOF)
	ELSE 	BEGIN
		RPLACD(NTHCDR(PROOF, LINO - 1), NIL);
		PUTPROP(CURPROOF(), PROOF, 'PROOF);
		END;
	INITPROOF(CURPROOF());
	SHOWCURLINE();
	END;


FEXPR FINDL (L);
	BEGIN
	NEW PRF, TXT, WFF;
	WFF ← CAR L;
	PRF ← 	IF ¬NULL CDR L THEN L[2]
		ELSE CURPROOF();
	TXT ← GET(PRF, 'PROOF);
LOOP; 	IF NULL TXT THEN RETURN NIL;
	IF WFF = TXT[1,2] THEN SHOWLINE(CAR TXT);
	TXT ← CDR TXT;
	GO LOOP;
	END;


FEXPR GIVEAX (L);
	BEGIN
	IF ¬ATOM CAR L THEN ERREND('(NON ATOMIC AXIOM NAME));
	IF ¬(CAR L ε AXIOMS) THEN AXIOMS ← AXIOMS @ <CAR L>;
	PUTPROP(CAR L, L[2], 'AXIOM);
	IF ?*PRINT THEN SHOWAXIOM(CAR L);
	END;


FEXPR GIVESCHM (L);
	BEGIN
	IF ¬ATOM CAR L THEN ERREND('(NON ATOMIC SCHEMA NAME));
	IF ¬(CAR L ε SCHEMAS) THEN SCHEMAS ← SCHEMAS @ <CAR L>;
	PUTPROP(CAR L, L[2], 'SCHEMA);
	IF ?*PRINT THEN SHOWSCHEMA(CAR L);
	END;


EXPR INVENTORY ();
	BEGIN
	IF ¬NULL AXIOMS THEN 
		BEGIN
		TERPRI();
		PRINT 'AXIOMS;
		PRINL(AXIOMS);
		END;
	IF ¬NULL SCHEMAS THEN 
		BEGIN
		TERPRI();
		PRINT 'SCHEMAS;
		PRINL(SCHEMAS);
		END;
	IF ¬NULL PROOFS THEN 
		BEGIN
		TERPRI();
		PRINT 'PROOFS;
		PRINL(PROOFS);
		END;
	IF ¬NULL THEOREMS THEN 
		BEGIN
		TERPRI();
		PRINT 'THEOREMS;
		PRINL(THEOREMS);
		END;
	END;


FEXPR MAKETHM (ARG
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ARG
                  );
	MAKETHEOREM1(CAR ARG
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ARG
                            , ARG
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ARG
                                 [2], 
		IF ¬NULL CDDR ARG
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ARG
                                  THEN ARG
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ARG
                                          [3]
		ELSE CURPROOF());


EXPR ONDD ();
	BEGIN
	INITSTANCHARSET();
	LINELENGTH (CONSOLEWIDTH ← DDWIDTH);
	END;


EXPR ONIII ();
	BEGIN
	INITSTANCHARSET();
	LINELENGTH (CONSOLEWIDTH ← IIIWIDTH);
	END;


EXPR ONIMLAC ();
	BEGIN
	INITSTANCHARSET();
	LINELENGTH (CONSOLEWIDTH ← IMLACWIDTH);
	END;


EXPR ONTTY ();
	BEGIN
	INITTTYCHARSET();
	LINELENGTH (CONSOLEWIDTH ← TTYWIDTH);
	END;


FEXPR PROOF (NAME);
	BEGIN
	IF NULL NAME THEN ERREND('(NO NAME GIVEN));
	IF ¬ATOM CAR NAME THEN ERREND('(NON ATOMIC PROOF NAME));
	INITPROOF(CAR NAME);
	IF ?*PRINT THEN SHOWCURLINE();
	END;


FEXPR REDO (ARGS);
	BEGIN
	NEW CHANGED, CURL, LASTL, NEWC;
	IF WFFPART(CAR ARGS) ≠ WFFPART(ARGS[2]) THEN ERREND('(CANNOT REDO));
	CHANGED ← (CAR ARGS CONS ARGS[2]) CONS NIL;
	CURL ← CAR ARGS + 1;
	LASTL ← CURLINE() + 1;
LOOP; 	IF CURL EQ LASTL THEN RETURN NIL;
	NEWC ← SUBLIS(CHANGED, BYPART(CURL));
	IF NEWC = BYPART(CURL) THEN GO ELOOP
	ELSE EVAL NEWC;
	CHANGED ← (CURL CONS CURLINE()) CONS CHANGED;
ELOOP; 	CURL ← CURL + 1;
	GO LOOP;
	END;


FEXPR RESTOREALL (FILES);
	BEGIN
	NEW DEV, FILE, ?*PRINT;
	IF ?*FILEPRINT THEN 
		BEGIN
		?*PRINT ← T;
		END;
	DEV ← 'DSK;
LOOP; 	IF NULL FILES THEN GO EXIT;
	FILE ← CAR FILES;
	IF ATOM FILE THEN GO READ;
	IF CAR FILE = 'QUOTE THEN GO DEVICE;
	IF CAR FILE = 'CONS THEN GO DOTTED;
	ERREND('(NOT FILE OR DEVICE NAME));
READ; 	READIN(DEV, <FILE>, NIL);
	GO ELOOP;
DOTTED; 	FILE ← FILE[2] CONS FILE[3];
	GO READ;
DEVICE; 	DEV ← FILE[2];
	GO ELOOP;
ELOOP; 	FILES ← CDR FILES;
	GO LOOP;
EXIT; 	INVENTORY();
	END;


FEXPR SAVEALL (FILE);
	BEGIN
	NEW DEV, ITEM;
	DEV ← 'DSK;
LOOP; 	IF NULL FILE THEN ERREND('(DEVICE BUT NO FILE));
	ITEM ← CAR FILE;
	IF ATOM ITEM THEN GO OUTPUT;
	IF CAR ITEM = 'QUOTE THEN GO DEVICE;
	IF CAR ITEM = 'CONS THEN GO DOTTED;
	ERREND('(NOT FILE SPECIFIER));
DEVICE; 	DEV ← ITEM[2];
	FILE ← CDR FILE;
	GO LOOP;
DOTTED; 	ITEM ← ITEM[2] CONS ITEM[3];
OUTPUT; 	EVAL <'OUTPUT, DEV, ITEM>;
	OUTC(T, NIL);
	LINELENGTH FILEWIDTH;
	MAPC(FUNCTION(SAVEAXIOM), AXIOMS);
	MAPC(FUNCTION(SAVESCHEMA), SCHEMAS);
	MAPC(FUNCTION(SAVEPROOF), PROOFS);
	MAPC(FUNCTION(SAVETHEOREM), THEOREMS);
	OUTC(NIL, T);
	INVENTORY();
	END;


FEXPR SAVECOMS (FILE);
	BEGIN
	NEW DEV, ITEM;
	DEV ← 'DSK;
LOOP; 	IF NULL FILE THEN ERREND('(NO FILE SPECIFIED));
	ITEM ← CAR FILE;
	IF ATOM ITEM THEN GO OUTPUT;
	IF CAR ITEM = 'QUOTE THEN GO DEVICE;
	IF CAR ITEM = 'CONS THEN GO DOTTED;
	ERREND('(NOT FILE SPECIFIER));
DEVICE; 	DEV ← ITEM[2];
	FILE ← CDR FILE;
	GO LOOP;
DOTTED; 	ITEM ← ITEM[2] CONS ITEM[3];
OUTPUT; 	EVAL <'OUTPUT, DEV, ITEM>;
	OUTC(T, NIL);
	LINELENGTH FILEWIDTH;
	MAPC(FUNCTION(SAVEAXCOM), AXIOMS);
	MAPC(FUNCTION(SAVESCHMCOM), SCHEMAS);
	MAPC(FUNCTION(SAVEPRFCOM), PROOFS);
	MAPC(FUNCTION(SAVETHMCOM), THEOREMS);
	OUTC(NIL, T);
	INVENTORY();
	END;


FEXPR SHOW (THINGS);
	BEGIN
	NEW LINE1, LINE2, TEM;
TOP; 	IF NULL THINGS THEN RETURN SHOWPROOF(CURPROOF());
LOOP; 	IF NULL THINGS THEN GO EXIT;
	IF ¬ATOM CAR THINGS THEN GO DEV;
	IF NUMBERP CAR THINGS THEN GO LINES;
	TEM ← GETGET(CAR THINGS, 'IMAGE);
	IF NULL TEM THEN ERREND('(NOTHING TO SHOW));
	EVAL '((CADR TEM) (CAR THINGS));
ELOOP; 	THINGS ← CDR THINGS;
	GO LOOP;
LINES; 	LINE1 ← CAR THINGS;
	THINGS ← CDR THINGS;
	IF NULL THINGS | ¬NUMBERP CAR THINGS THEN LINE2 ← LINE1
	ELSE 	BEGIN
		LINE2 ← CAR THINGS;
		THINGS ← CDR THINGS;
		END;
LLOOP; 	IF LINE1 ?*GREAT LINE2 THEN GO EXIT;
	SHOWLINE(GETLINE(LINE1));
	LINE1 ← LINE1 + 1;
	GO LLOOP;
DEV; 	IF THINGS[1,1] ≠ 'QUOTE THEN ERREND('(NEED NAME OR FILE SPEC));
	EVAL ('OUTPUT CONS THINGS[1,2]);
	OUTC(T, T);
	THINGS ← CDR THINGS;
	GO TOP;
EXIT; 	OUTC(NIL, T);
	END;


FEXPR SHOWALL (FILE);
	BEGIN
	NEW DEV, ITEM;
	DEV ← 'DSK;
LOOP; 	IF NULL FILE THEN ERREND('(NO FILE SPECIFIED));
	ITEM ← CAR FILE;
	IF ATOM ITEM THEN GO OUTPUT;
	IF CAR ITEM = 'QUOTE THEN GO DEVICE;
	IF CAR ITEM = 'CONS THEN GO DOTTED;
	ERREND('(NOT FILE SPECIFIER));
DEVICE; 	DEV ← ITEM[2];
	FILE ← CDR FILE;
	GO LOOP;
DOTTED; 	ITEM ← ITEM[2] CONS ITEM[3];
OUTPUT; 	EVAL <'OUTPUT, DEV, ITEM>;
	OUTC(T, NIL);
	LINELENGTH FILEWIDTH;
	MAPC(FUNCTION(SHOWAXIOM), AXIOMS);
	MAPC(FUNCTION(SHOWSCHEMA), SCHEMAS);
	MAPC(FUNCTION(SHOWPROOF), PROOFS);
	MAPC(FUNCTION(SHOWTHEOREM), THEOREMS);
	OUTC(NIL, T);
	INVENTORY();
	END;


FEXPR SSEX (L);
	BEGIN
	NEW LINE, NAME, PRF;
	NAME ← 	IF NULL L THEN CURPROOF()
		ELSE CAR L;
	PRF ← GETL(NAME, '(PROOF));
	IF NULL PRF THEN ERREND('(NO PROOF BY THAT NAME));
	PRF ← PRF[2];
	PRINT 'PROOF;
	PRINS(NAME);
LOOP; 	IF NULL PRF THEN RETURN NIL;
	LINE ← CAR PRF;
	TERPRI();
	PRINC CAR LINE;
	PRINC '?/;
	PRINTSUBEXPR(LINE[2], CURCOL(), 0);
	IF FLATSIZE CDDR LINE + 6 ?*GREAT CHRCT() THEN GO MANY;
	PRINC '?/;
	PRINS('BY);
	PRINS(LINE[3]);
	IF ¬NULL LINE[4] THEN 
		BEGIN
		PRINS('ASS);
		PRIN1 LINE[4];
		END;
ELOOP; 	PRF ← CDR PRF;
	GO LOOP;
MANY; 	TERPRI();
	PRINTN('?/, 4);
	PRINC 'BY;
	PRINC '?/;
	PRINTSUBEXPR(LINE[3], CURCOL(), 0);
	IF NULL LINE[4] THEN GO ELOOP;
	TERPRI();
	PRINTN('?/, 4);
	PRINC 'ASS;
	PRINC '?/;
	PRINS(LINE[4]);
	GO ELOOP;
	END;


EXPR ADDLINE (WFF, JUST, ASS);
	BEGIN
	PUTPROP(CURPROOF(), CURTEXT() NCONC <<CURLINE() + 1, WFF, JUST, ASS>>, 'PROOF);
	CURLIN ← CURLIN + 1;
	PUTPROP('?@, CURLINE(), 'NEWNAM);
	IF ?*PRINT THEN SHOWCURLINE();
	END;


FEXPR ADDAXIOM (L);
	BEGIN
	PUTPROP(CAR L, L[2], 'AXIOM);
	AXIOMS ← CAR L CONS AXIOMS;
	END;


FEXPR ADDSCHEMA (L);
	BEGIN
	PUTPROP(CAR L, L[2], 'SCHEMA);
	SCHEMAS ← CAR L CONS SCHEMAS;
	END;


FEXPR ADDTHEOREM (L);
	BEGIN
	PUTPROP(CAR L, L[2], 'THEOREM);
	THEOREMS ← CAR L CONS THEOREMS;
	END;


EXPR ALPHAPART (IDENT);
	BEGIN
	NEW CHARS;
	CHARS ← REVERSE EXPLODE IDENT;
LOOP; 	IF ¬NUMBERP CAR CHARS THEN RETURN READLIST REVERSE CHARS;
	CHARS ← CDR CHARS;
	GO LOOP;
	END;


EXPR ALLVARS (EXPRESSION);
	ALLVARS1(EXPRESSION, NIL);


EXPR ALLVARS1 (EXP, VARS);
	IF ATOM EXP THEN 
		IF ISVAR(EXP) THEN 
			IF EXP ε VARS THEN VARS
			ELSE EXP CONS VARS
		ELSE VARS
	ELSE ALLVARSL(CDR EXP, VARS);


EXPR ALLVARSL (EXPL, VARS);
	IF NULL EXPL THEN VARS
	ELSE ALLVARS1(CAR EXPL, ALLVARSL(CDR EXPL, VARS));


EXPR ALT1 (I1, I2);
	LAMBDA (U, V); 
		IF VALID(U) THEN SUBLIS(U, 'QQQ)
		ELSE IF VALID(V) THEN SUBLIS(V, 'QQQ)
		ELSE 'INVALID;
	(INST(I1 CONS I2, '((IMPLIES PPP QQQ) IMPLIES (NOT PPP) QQQ), NIL), INST(I2 CONS I1, '((IMPLIES PPP QQQ
		) IMPLIES (NOT PPP) QQQ), NIL));


EXPR ANDELIM1 (WFF, PLACES);
	BEGIN
	NEW CHOSEN, LEN;
	LEN ← LENGTH CDR WFF;
	IF CAR WFF NEQ 'AND THEN ERREND('(FIRST ARG IS NOT AN AND));
LOOP; 	IF NULL PLACES THEN RETURN CONJOIN(REVERSE CHOSEN);
	IF CAR PLACES ?*GREAT LEN THEN ERREND('(TOO FEW CONJUNCTS));
	CHOSEN ← NTHELT(CDR WFF, CAR PLACES) CONS CHOSEN;
	PLACES ← CDR PLACES;
	GO LOOP;
	END;


EXPR ASSLIST (L);
	MAPCAR(FUNCTION(ASSPART), L);


EXPR ASSOCR (ITM, LST);
	BEGIN
LOOP; 	IF NULL LST THEN RETURN NIL;
	IF ITM EQ CDAR LST THEN RETURN CAR LST;
	LST ← CDR LST;
	GO LOOP;
	END;


EXPR ASSPART (LINE);
	GETLINE(LINE)[4];


EXPR BINAND (ARGS);
	IF NULL ARGS THEN '(AND TRUE TRUE)
	ELSE IF NULL CDR ARGS THEN <'AND, CAR ARGS, 'TRUE>
	ELSE IF NULL CDDR ARGS THEN 'AND CONS ARGS
	ELSE <'AND, CAR ARGS, BINAND(CDR ARGS)>;


EXPR BINOR (ARGS);
	IF NULL ARGS THEN '(OR FALSE FALSE)
	ELSE IF NULL CDR ARGS THEN <'OR, CAR ARGS, 'FALSE>
	ELSE IF NULL CDDR ARGS THEN 'OR CONS ARGS
	ELSE <'OR, CAR ARGS, BINOR(CDR ARGS)>;


EXPR BYPART (LINE);
	GETLINE(LINE)[3];


EXPR BOUNDSUBST (EXP, SUBS, BINDS);
	BEGIN
	NEW TEM;
	IF ATOM EXP THEN GO ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                                ;
	IF ISQUANT(EXP[1,1]) THEN GO QUANT;
	RETURN BOUNDSUBSTL(EXP, SUBS, BINDS);
ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
    ; 	IF ISCONST(EXP) THEN RETURN EXP;
	TEM ← ASSOC(EXP, BINDS);
	IF ¬NULL TEM THEN RETURN CDR TEM;
	TEM ← ASSOCR(EXP, BINDS);
	IF ¬NULL TEM THEN ERREND('(FREE VARIABLE CAPTURE));
	RETURN EXP;
QUANT; 	TEM ← ASSOC(EXP[1,2], SUBS);
	TEM ← 	IF ¬NULL TEM THEN CDR TEM
		ELSE EXP[1,2];
	IF ¬NULL ASSOCR(TEM, BINDS) THEN ERREND('(BOUND VARIABLE CAPTURE));
	RETURN <<EXP[1,1], TEM>, BOUNDSUBST(EXP[2], SUBS, (EXP[1,2] CONS TEM) CONS BINDS)>;
	END;


EXPR BOUNDSUBSTL (LST, SUBS, BINDS);
	IF NULL LST THEN NIL
	ELSE BOUNDSUBST(CAR LST, SUBS, BINDS) CONS BOUNDSUBSTL(CDR LST, SUBS, BINDS);


EXPR CONJOIN (WFFS);
	IF NULL WFFS THEN 'TRUE
	ELSE IF NULL CDR WFFS THEN CAR WFFS
	ELSE 'AND CONS WFFS;


EXPR CURCOL ();
	LINELENGTH NIL + (1 - CHRCT());


EXPR CURLINE ();
	PROG2(CURPROOF(), CURLIN);


EXPR CURPROOF ();
	IF NULL CURPRF THEN ERREND('(NO CURRENT PROOF))
	ELSE CURPRF;


EXPR CURTEXT ();
	GET(CURPROOF(), 'PROOF);


EXPR DOUBLENEG (PROP);
	LAMBDA (W); 
		IF ¬VALID(W) THEN 'INVALID
		ELSE SUBLIS(W, 'PPP);
	(INST(PROP, '(NOT (NOT PPP)), NIL));


EXPR EXGEN1 (WFF, VARS);
	BEGIN
LOOP; 	IF NULL VARS THEN RETURN WFF;
	IF ATOM CAR VARS THEN GO ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                                     ;
	IF VARS[1,1] = 'CONS THEN GO DOT;
	ERREND('(ILLEGAL ARGUMENT));
ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
    ; 	WFF ← EXGEN(WFF, CAR VARS, CAR VARS);
	GO ELOOP;
DOT; 	WFF ← EXGEN(WFF, VARS[1,2], VARS[1,3]);
ELOOP; 	VARS ← CDR VARS;
	GO LOOP;
	END;


EXPR EXGEN (WFF, OLD, NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                         );
	BEGIN
	NEW TEM;
	TEM ← GENSYM();
	WFF ← SUBST(TEM, OLD, WFF);
	IF NEW
*** WARNING, MLISP RESERVED WORD:  NEW
               ε ALLVARS(WFF) THEN ERREND('(NEW VARIABLE CONFLICTS));
	RETURN <<'THEREEXISTS, NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                                  >, SUBST(NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                                              , TEM, WFF)>;
	END;


EXPR EQI1 (WFF1, WFF2);
	LAMBDA (W); 
		IF ¬VALID(W) THEN 'INVALID
		ELSE SUBLIS(W, '(EQUIVALENT PPP QQQ));
	(INST(WFF1 CONS WFF2, '((IMPLIES PPP QQQ) IMPLIES QQQ PPP), NIL));


EXPR ERREND (MESSAGE);
	BEGIN
	PRINT MESSAGE;
	ERR();
	END;


EXPR FREEIN (VAR, LINES);
	IF NULL LINES THEN NIL
	ELSE IF VAR ε FREEVARS(WFFPART(CAR LINES)) THEN T
	ELSE FREEIN(VAR, CDR LINES);


EXPR FREEVARS (EXPRESSION);
	FREEVARS1(NIL, NIL, EXPRESSION);


EXPR FREEVARS1 (BVARS, FVARS, EXP);
	IF ATOM EXP THEN 
		IF ISVAR(EXP) THEN 
			IF EXP ε BVARS THEN FVARS
			ELSE IF EXP ε FVARS THEN FVARS
			ELSE EXP CONS FVARS
		ELSE FVARS
	ELSE IF ATOM CAR EXP THEN FREEVARS2(BVARS, FVARS, CDR EXP)
	ELSE IF ATOM EXP[1,1] THEN 
		(IF EXP[1,1] ε '(FORALL THEREEXISTS) THEN 
			FREEVARS1(EXP[1,2] CONS BVARS, FVARS, EXP[3]))
	ELSE ERREND('(UNKNOWN NONATOMIC FUNCTION));


EXPR FREEVARS2 (BVARS, FVARS, EXPL);
	IF NULL EXPL THEN FVARS
	ELSE FREEVARS1(BVARS, FREEVARS2(BVARS, FVARS, CDR EXPL), CAR EXPL);


EXPR GETCURLINE ();
	GETLINE(CURLINE());


EXPR GETLINE (LINENO);
	BEGIN
	NEW TEM;
	TEM ← ASSOC(LINENO, CURTEXT());
	IF NULL TEM THEN ERREND('(NO SUCH LINE));
	RETURN TEM;
	END;


FEXPR GIVEPROOF (L);
	BEGIN
	IF ¬ATOM CAR L THEN ERREND('(NON ATOMIC PROOF NAME));
	IF ¬(CAR L ε PROOFS) THEN PROOFS ← PROOFS @ <CAR L>;
	PUTPROP(CAR L, L[2], 'PROOF);
	END;


EXPR IFE1 (WFF1, WFF2);
	LAMBDA (W, X, Y, Z); 
		IF VALID(W) THEN SUBLIS(W, 'QQQ)
		ELSE IF VALID(X) THEN SUBLIS(X, 'RRR)
		ELSE IF VALID(Y) THEN SUBLIS(Y, 'QQQ)
		ELSE IF VALID(Z) THEN SUBLIS(Z, 'RRR)
		ELSE 'INVALID;
	(INST(WFF1 CONS WFF2, '(PPP COND (PPP QQQ) (T RRR)), NIL), INST(WFF1 CONS WFF2, '((NOT PPP) COND (PPP 
		QQQ) (T RRR)), NIL), INST(WFF2 CONS WFF1, '(PPP COND (PPP QQQ) (T RRR)), NIL), INST(WFF2 CONS 
		WFF1, '((NOT PPP) COND (PPP QQQ) (T RRR)), NIL));


EXPR IFI1 (WFF1, WFF2);
	LAMBDA (W, X); 
		IF VALID(W) THEN SUBLIS(W, '(COND (PPP QQQ) (T RRR)))
		ELSE IF VALID(X) THEN SUBLIS(X, '(COND (PPP QQQ) (T RRR)))
		ELSE 'INVALID;
	(INST(WFF1 CONS WFF2, '((IMPLIES PPP QQQ) IMPLIES (NOT PPP) RRR), NIL), INST(WFF2 CONS WFF1, '((IMPLIES
		 PPP QQQ) IMPLIES (NOT PPP) RRR), NIL));


EXPR INITALL ();
	BEGIN
	CURPRF ← NIL;
	AXIOMS ← NIL;
	THEOREMS ← NIL;
	PROOFS ← NIL;
	SCHEMAS ← NIL;
	END;


EXPR INITOPS ();
	BEGIN
	NEW INCR, OP, PREC, PRECLIS;
	PRECLIS ← '?*COMMA?* CONS 'SETQ CONS PRECLIS?*;
LOOP; 	IF NULL PRECLIS THEN RETURN NIL;
	OP ← CAR PRECLIS;
	PREC ← GET(OP, 'INFIX);
	INCR ← 	IF GET(OP, 'LEFT) THEN MINUS 1
		ELSE 1;
	PUTPROP(OP, <3 * PREC + INCR, 3 * PREC - INCR>, 'PREC);
	PRECLIS ← CDR PRECLIS;
	GO LOOP;
	END;


EXPR INITPROOF (NAME);
	BEGIN
	IF NULL NAME THEN ERREND('(NIL NOT ACCEPTABLE PROOF NAME));
	CURPRF ← NAME;
	IF GETL(NAME, '(PROOF)) THEN GO EXIST;
	PUTPROP(NAME, NIL, 'PROOF);
	PROOFS ← PROOFS @ <NAME>;
EXIST; 	CURLIN ← 
		IF NULL CURTEXT() THEN 0
		ELSE (LAST CURTEXT())[1,1];
	PUTPROP('?@, CURLINE(), 'NEWNAM);
	END;


EXPR INITSTANCHARSET ();
	BEGIN
	PUTPROP('AND, '?∧, 'INFXNAM);
	PUTPROP('CMAPS, '?→?→, 'INFXNAM);
	PUTPROP('?*COMMA?*, '?,, 'INFXNAM);
	PUTPROP('CONS, '?., 'INFXNAM);
	PUTPROP('CONTAINED, '?⊂, 'INFXNAM);
	PUTPROP('DIFFERENCE, '?-, 'INFXNAM);
	PUTPROP('EQUAL, '?=, 'INFXNAM);
	PUTPROP('EQUIVALENT, '?≡, 'INFXNAM);
	PUTPROP('EXPT, '?↑, 'INFXNAM);
	PUTPROP('FORALL, '?∀, 'INFXNAM);
	PUTPROP('GEQ, '?≥, 'INFXNAM);
	PUTPROP('GREATERP, '?>, 'INFXNAM);
	PUTPROP('IMPLIES, '?⊃, 'INFXNAM);
	PUTPROP('INTERSECTION, '?∩, 'INFXNAM);
	PUTPROP('LAMBDA, '?λ, 'INFXNAM);
	PUTPROP('LEQ, '?≤, 'INFXNAM);
	PUTPROP('LESSP, '?<, 'INFXNAM);
	PUTPROP('MAPS, '?→, 'INFXNAM);
	PUTPROP('MEMBER, '?ε, 'INFXNAM);
	PUTPROP('MINUS, '?-, 'INFXNAM);
	PUTPROP('NEQ, '?≠, 'INFXNAM);
	PUTPROP('NOT, '?¬, 'INFXNAM);
	PUTPROP('OR, '?∨, 'INFXNAM);
	PUTPROP('PLUS, '?+, 'INFXNAM);
	PUTPROP('PRODUCT, '?⊗, 'INFXNAM);
	PUTPROP('QUOTE, '?', 'INFXNAM);
	PUTPROP('QUOTIENT, '?/, 'INFXNAM);
	PUTPROP('SETQ, '?←, 'INFXNAM);
	PUTPROP('THEREEXISTS, '?∃, 'INFXNAM);
	PUTPROP('TIMES, '?*, 'INFXNAM);
	PUTPROP('UNION, '?∪, 'INFXNAM);
	END;


EXPR INITTTYCHARSET ();
	BEGIN
	PUTPROP('AND, '?&, 'INFXNAM);
	PUTPROP('CMAPS, '? CMAPS? , 'INFXNAM);
	PUTPROP('?*COMMA?*, '?,, 'INFXNAM);
	PUTPROP('CONS, '?., 'INFXNAM);
	PUTPROP('CONTAINED, '? CONT? , 'INFXNAM);
	PUTPROP('DIFFERENCE, '?-, 'INFXNAM);
	PUTPROP('EQUAL, '?=, 'INFXNAM);
	PUTPROP('EQUIVALENT, '?<?=?>, 'INFXNAM);
	PUTPROP('EXPT, '?↑, 'INFXNAM);
	PUTPROP('FORALL, 'A, 'INFXNAM);
	PUTPROP('GEQ, '?>?=, 'INFXNAM);
	PUTPROP('GREATERP, '?>, 'INFXNAM);
	PUTPROP('IMPLIES, '?=?>, 'INFXNAM);
	PUTPROP('INTERSECTION, '? INTERSECT? , 'INFXNAM);
	PUTPROP('LAMBDA, 'L, 'INFXNAM);
	PUTPROP('LEQ, '?<?=, 'INFXNAM);
	PUTPROP('LESSP, '?<, 'INFXNAM);
	PUTPROP('MAPS, '? MAPS? , 'INFXNAM);
	PUTPROP('MEMBER, '? MEMBER? , 'INFXNAM);
	PUTPROP('MINUS, '?-, 'INFXNAM);
	PUTPROP('NEQ, '? NEQ? , 'INFXNAM);
	PUTPROP('NOT, '?-, 'INFXNAM);
	PUTPROP('OR, '? V? , 'INFXNAM);
	PUTPROP('PLUS, '?+, 'INFXNAM);
	PUTPROP('PRODUCT, '? PROD? , 'INFXNAM);
	PUTPROP('QUOTE, '?', 'INFXNAM);
	PUTPROP('QUOTIENT, '?/, 'INFXNAM);
	PUTPROP('SETQ, '?←, 'INFXNAM);
	PUTPROP('THEREEXISTS, 'E, 'INFXNAM);
	PUTPROP('TIMES, '?*, 'INFXNAM);
	PUTPROP('UNION, '? UNION? , 'INFXNAM);
	END;


EXPR INST (EXP, MODEL, PAIRS);
	IF ¬VALID(PAIRS) THEN 'INVALID
	ELSE IF ATOM MODEL THEN 
		IF MODEL ε '(PPP QQQ RRR SSS) THEN 
			LAMBDA (W); 
				IF NULL W THEN (MODEL CONS EXP) CONS PAIRS
				ELSE IF CDR W = EXP THEN PAIRS
				ELSE 'INVALID;
			(ASSOC(MODEL, PAIRS))
		ELSE IF MODEL EQ EXP THEN PAIRS
		ELSE 'INVALID
	ELSE IF ATOM EXP THEN 'INVALID
	ELSE INST(CDR EXP, CDR MODEL, INST(CAR EXP, CAR MODEL, PAIRS));


EXPR ISCONST (X);
	NUMBERP X | X ε LOGICALCONSTANTS;


EXPR ISEQUIVALENCE (WFF);
	WFF ε '(EQUAL EQUIVALENT SETQ);


EXPR ISIDENT (X);
	ATOM X & ¬NUMBERP X;


EXPR ISQUANT (X);
	X ε QUANTIFIERS;


EXPR ISVAR (X);
	ISIDENT(X) & ¬ISCONST(X);


EXPR LAMEXP (FORMULA);
	IF ATOM FORMULA THEN FORMULA
	ELSE IF ATOM CAR FORMULA THEN CAR FORMULA CONS LAMEXPL(CDR FORMULA)
	ELSE IF FORMULA[1,1,1] = 'LAMBDA THEN PROPSUBST(FORMULA[2], FORMULA[1,1,2], FORMULA[1,2])
	ELSE LAMEXP(CAR FORMULA) CONS LAMEXPL(CDR FORMULA);


EXPR LAMEXPL (LIST);
	MAPCAR(FUNCTION(LAMEXP), LIST);


EXPR MAKECONSES (L);
	BEGIN
	NEW RES;
LOOP; 	IF NULL L THEN RETURN RES;
	IF ATOM CAR L | L[1,1] NEQ 'CONS | LENGTH CAR L NEQ 3 THEN ERREND('(BAD ARGUMENT));
	RES ← (L[1,2] CONS L[1,3]) CONS RES;
	L ← CDR L;
	GO LOOP;
	END;


EXPR MAKERNL (FREEV, ALLV);
	BEGIN
	NEW CNT, ID, NVAR, NEWVARS, VAR;
LOOP; 	IF NULL FREEV THEN RETURN NEWVARS;
	VAR ← CAR FREEV;
	IF VAR ε ALLV THEN GO MAKE;
ELOOP; 	FREEV ← CDR FREEV;
	GO LOOP;
MAKE; 	ID ← ALPHAPART(VAR);
	CNT ← 1;
MAKE1; 	NVAR ← MAKESYM(ID, CNT);
	IF NVAR ε ALLV THEN GO EMAKE;
	NEWVARS ← (VAR CONS NVAR) CONS NEWVARS;
	GO ELOOP;
EMAKE; 	CNT ← CNT + 1;
	GO MAKE1;
	END;


EXPR MAKEVAR (V, L);
	BEGIN
	NEW TEM;
	TEM ← MAKERNL(<V>, L);
	RETURN (IF NULL TEM THEN V
		ELSE CDAR TEM);
	END;


EXPR MAKESYM (IDENT, NUM);
	READLIST (EXPLODE IDENT @ EXPLODE NUM);


EXPR MAKETHEOREM1 (THEOREM, LINE, PROOF);
	BEGIN
	INITPROOF(PROOF);
	IF ¬NULL ASSPART(LINE) THEN ERREND('(STILL HAS ASSUMPTIONS));
	PUTPROP(THEOREM, WFFPART(LINE), 'THEOREM);
	PUTPROP(THEOREM, <LINE, PROOF>, 'BY);
	THEOREMS ← THEOREMS @ <THEOREM>;
	IF ?*PRINT THEN SHOWTHEOREM(THEOREM);
	END;


EXPR MP1 (U, V);
	BEGIN
	NEW W;
	W ← INST(U CONS V, '(PPP IMPLIES PPP QQQ), NIL);
	IF ¬VALID(W) THEN W ← INST(V CONS U, '(PPP IMPLIES PPP QQQ), NIL);
	IF ¬VALID(W) THEN RETURN 'INVALID
	ELSE RETURN SUBLIS(W, 'QQQ);
	END;


EXPR NEXTLINE ();
	CURLINE() + 1;


EXPR NOTELIM (X, NOTX);
	LAMBDA (X, Y); 
		IF ¬VALID(X) THEN Y
		ELSE X;
	(INST(X CONS NOTX, '(PPP NOT PPP), NIL), INST(NOTX CONS X, '(PPP NOT PPP), NIL));


EXPR NOTINTRO (PROP);
	LAMBDA (W); 
		IF ¬VALID(W) THEN 'INVALID
		ELSE SUBLIS(W, '(NOT PPP));
	(INST(PROP, '(IMPLIES PPP FALSE), NIL));


EXPR NTHCDR (L, N);
	IF N = 0 THEN L
	ELSE NTHCDR(CDR L, N - 1);


EXPR NTHELT (L, N);
	CAR NTHCDR(L, N - 1);


EXPR NUMPART (LINE);
	CAR GETLINE(LINE);


EXPR ORELIM1 (DISJUN, IMPS);
	BEGIN
	NEW ANTECEDS, PREMS, RES;
	IF CAR DISJUN NEQ 'OR THEN ERREND('(FIRST ARG MUST BE DISJUNCTION));
	IF NULL CDR DISJUN THEN ERREND('(NO DISJUNCTS));
	IF NULL IMPS THEN ERREND('(NEED AT LEAST ONE IMPLICATION));
	PREMS ← CDR DISJUN;
	RES ← CDDAR IMPS;
LOOP1; 	IF IMPS[1,1] NEQ 'IMPLIES THEN ERREND('(ARG NOT IMPLICATION));
	IF CDDAR IMPS NEQ RES THEN ERREND('(MULTIPLE CONCLUSIONS));
	ANTECEDS ← IMPS[1,2] CONS ANTECEDS;
	IF ¬NULL (IMPS ← CDR IMPS) THEN GO LOOP1;
LOOP2; 	IF NULL PREMS THEN RETURN CAR RES;
	IF ¬(CAR PREMS ε ANTECEDS) THEN ERREND('(UNPROVEN DISJUNCT));
	PREMS ← CDR PREMS;
	GO LOOP2;
	END;


EXPR PCERR ();
	BEGIN
	PRINT 'PROOF?-CHECKER;
	LINELENGTH CONSOLEWIDTH;
	BEGIN
	?*FILEPRINT ← NIL;
	END;
	BEGIN
	?*PRINT ← T;
	END;
	BEGIN
	?*TWODIM ← NIL;
	END;
	EVAL '(BEGIN);
	END;


EXPR PCINIT ();
	BEGIN
	EXCISE();
	ONDD();
	INITOPS();
	INITALL();
	INITFN 'PCSTART;
	PRINT 'PROOF? CHECKER? INITIALIZED;
	END;


EXPR PCSTART ();
	BEGIN
	EVAL '(ERRSET (RESTOREALL (CONS PCHECK INI)) NIL);
	INITFN 'PCERR;
	PCERR();
	END;


EXPR PAIRLIS (CARS, CDRS);
	IF NULL CARS | NULL CDRS THEN NIL
	ELSE (CAR CARS CONS CAR CDRS) CONS PAIRLIS(CDR CARS, CDR CDRS);


EXPR QUANTEQUIV (EXP1, CONT1, EXP2, CONT2);
	BEGIN
	NEW GEN, TEM;
	IF ATOM EXP1 THEN GO ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                                 ;
	IF ATOM CAR EXP1 THEN GO FUN;
	IF ISQUANT(EXP1[1,1]) THEN GO QUANT;
LIST; 	IF NULL EXP1 THEN RETURN NULL EXP2;
	IF ¬QUANTEQUIV(CAR EXP1, CONT1, CAR EXP2, CONT2) THEN RETURN NIL;
	EXP1 ← CDR EXP1;
	EXP2 ← CDR EXP2;
	GO LIST;
ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
    ; 	TEM ← ASSOC(EXP1, CONT1);
	IF ¬NULL TEM THEN EXP1 ← CDAR TEM;
	TEM ← ASSOC(EXP2, CONT2);
	IF ¬NULL TEM THEN EXP1 ← CDAR TEM;
	RETURN (EXP1 = EXP2);
FUN; 	IF CAR EXP1 NEQ CAR EXP2 THEN RETURN NIL;
	EXP1 ← CDR EXP1;
	EXP2 ← CDR EXP2;
	GO LIST;
QUANT; 	IF ¬ISQUANT(EXP2[1,1]) | EXP1[1,1] NEQ EXP2[1,1] THEN RETURN NIL;
	GEN ← GENSYM();
	RETURN QUANTEQUIV(EXP1[2], (EXP1[1,2] CONS GEN) CONS CONT1, EXP2[2], (EXP2[1,2] CONS GEN) CONS CONT2)
		;
	END;


EXPR PROPSUBST (TERM, VAR, EXP);
	PROPSUBST1(TERM, VAR, EXP, MAKERNL(FREEVARS(TERM), ALLVARS(EXP)));


EXPR PROPSUBST1 (TERM, VAR, EXP, RNL);
	IF ATOM EXP THEN 
		IF ISVAR(EXP) THEN 
			IF EXP = VAR THEN TERM
			ELSE EXP
		ELSE EXP
	ELSE IF ¬ATOM CAR EXP & ISQUANT(EXP[1,1]) THEN 
		BEGIN
		NEW NEWNAM;
		NEWNAM ← ASSOC(EXP[1,2], RNL);
		NEWNAM ← 
			IF NULL NEWNAM THEN EXP[1,2]
			ELSE CDR NEWNAM;
		RETURN <<EXP[1,1], NEWNAM>, PROPSUBST1(TERM, VAR, SUBST(NEWNAM, EXP[1,2], EXP[2]), RNL)>;
		END
	ELSE PROPSUBST1(TERM, VAR, CAR EXP, RNL) CONS PROPSUBSTL(TERM, VAR, CDR EXP, RNL);


EXPR PROPSUBSTL (TERM, VAR, EXPL, RNL);
	IF NULL EXPL THEN NIL
	ELSE PROPSUBST1(TERM, VAR, CAR EXPL, RNL) CONS PROPSUBSTL(TERM, VAR, CDR EXPL, RNL);


EXPR REPEITHER (WFF, EQUAT, FLAG, ORD);
	IF ¬ISEQUIVALENCE(CAR EQUAT) THEN ERREND('(NO EQUATION))
	ELSE REPNTH(
		IF FLAG THEN EQUAT[3]
		ELSE EQUAT[2], 
		IF FLAG THEN EQUAT[2]
		ELSE EQUAT[3], WFF, ORD);


EXPR REPNTH (NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                , OLD, EXP, NUM);
	BEGIN
	NEW NEWEXP, ORDCNT;
	ORDCNT ← 0;
	NEWEXP ← REPNTH1(NEW
*** WARNING, MLISP RESERVED WORD:  NEW
                            , OLD, EXP, NIL, NUM);
	IF ORDCNT ?*LESS NUM THEN ERREND('(NO REPLACEMENT));
	RETURN NEWEXP;
	END;


EXPR REPNTH1 (NEXP, OEXP, EXP, CON, NUM);
	BEGIN
	NEW BVAR, GEN, NVAR;
	IF QUANTEQUIV(OEXP, NIL, EXP, CON) THEN GO GOTIT;
	IF ATOM EXP THEN RETURN EXP;
	IF ATOM CAR EXP THEN RETURN (CAR EXP CONS REPNTHL(NEXP, OEXP, CDR EXP, CON, NUM));
	IF ISQUANT(EXP[1,1]) THEN GO QUANT;
QUANT; 	GEN ← GENSYM();
	BVAR ← EXP[1,2];
	NVAR ← 	IF BVAR ε ALLVARS(NEXP) THEN MAKEVAR(BVAR, ALLVARS(EXP[2]))
		ELSE BVAR;
	RETURN <<EXP[1,1], NVAR>, REPNTH1(NEXP, OEXP, SUBST(NVAR, BVAR, EXP[2]), (NVAR CONS GEN) CONS CON, NUM
		)>;
GOTIT; 	ORDCNT ← ORDCNT + 1;
	RETURN (IF ORDCNT = NUM THEN NEXP
		ELSE EXP);
	END;


EXPR REPNTHL (NEXP, OEXP, LST, CON, NUM);
	IF NULL LST THEN NIL
	ELSE REPNTH1(NEXP, OEXP, CAR LST, CON, NUM) CONS REPNTHL(NEXP, OEXP, CDR LST, CON, NUM);


EXPR SAVEAXIOM (AXIOM);
	PRINTEXPR(<'ADDAXIOM, AXIOM, GET(AXIOM, 'AXIOM)>);


EXPR SAVEAXCOM (AXIOM);
	PRINTEXPR(<'GIVEAX, AXIOM, GET(AXIOM, 'AXIOM)>);


EXPR SAVEPRFCOM (PROOF);
	BEGIN
	NEW PRF;
	PRINT <'PROOF, PROOF>;
	PRF ← GET(PROOF, 'PROOF);
LOOP; 	IF NULL PRF THEN RETURN TERPRI();
	IF PRF[1,3,1] = 'USETHM THEN SAVETHMCOM(PRF[1,3,2]);
	PRINT PRF[1,1];
	PRINC '?	;
	PRINTSUBEXPR(PRF[1,3], 9, 0);
	PRF ← CDR PRF;
	GO LOOP;
	END;


EXPR SAVEPROOF (PROOF);
	PRINTEXPR(<'GIVEPROOF, PROOF, GET(PROOF, 'PROOF)>);


EXPR SAVESCHEMA (SCHEMA);
	PRINTEXPR(<'ADDSCHEMA, SCHEMA, GET(SCHEMA, 'SCHEMA)>);


EXPR SAVESCHMCOM (SCHEMA);
	PRINTEXPR(<'GIVESCHM, SCHEMA, GET(SCHEMA, 'SCHEMA)>);


EXPR SAVETHEOREM (THEOREM);
	PRINTEXPR(<'ADDTHM, THEOREM, CAR GET(THEOREM, 'BY), GET(THEOREM, 'BY)[2]>);


EXPR SAVETHMCOM (THEOREM);
	PRINTEXPR(<'MAKETHM, THEOREM, CAR GET(THEOREM, 'BY), GET(THEOREM, 'BY)[2]>);


EXPR SETDIF (X, Y);
	BEGIN
	NEW ANS;
LOOP; 	IF NULL X THEN RETURN REVERSE ANS;
	IF ¬(CAR X ε Y) THEN ANS ← CAR X CONS ANS;
	X ← CDR X;
	GO LOOP;
	END;


EXPR SHOWAXIOM (NAME);
	BEGIN
	PRINT 'AXIOM;
	PRINC NAME;
	TERPRI();
	SHOWEXP(GET(NAME, 'AXIOM));
	TERPRI();
	END;


EXPR SHOWCURLINE ();
	IF CURLINE() = 0 THEN SHOW()
	ELSE SHOWLINE(GETCURLINE());


EXPR SHOWEXP (EXP);
	IF ?*TWODIM THEN TDDEXP(EXP, CURCOL(), 0)
	ELSE INFX(EXP);


EXPR SHOWLINE (LINTXT);
	BEGIN
	NEW COM;
	TERPRI();
	TERPRI();
	PRINC CAR LINTXT;
	PRINC ':;
	PRINC '?	;
	SHOWEXP(LINTXT[2]);
	PRINS('BY);
	COM ← LINTXT[3];
	IF CAR COM = 'ASS THEN GO ASS;
	IF CAR COM = 'USEAX THEN COM ← 'AXIOM CONS CDR COM;
	IF CAR COM = 'USESCHM THEN COM ← 'SCHEMA CONS CDR COM;
	IF CAR COM = 'USETHM THEN COM ← 'THEOREM CONS CDR COM;
	SHOWEXP(COM);
	IF NULL LINTXT[4] THEN RETURN NIL;
	PRINS('ASSUMING);
	PRINS(LINTXT[4]);
	RETURN NIL;
ASS; 	PRINS('ASSUMPTION);
	END;


EXPR SHOWPROOF (NAME);
	BEGIN
	PRINT 'PROOF;
	PRINS(NAME);
	MAPC(FUNCTION(SHOWLINE), GET(NAME, 'PROOF));
	TERPRI();
	END;


EXPR SHOWSCHEMA (NAME);
	BEGIN
	PRINT 'SCHEMA;
	PRINC NAME;
	TERPRI();
	SHOWEXP(GET(NAME, 'SCHEMA));
	TERPRI();
	END;


EXPR SHOWTHEOREM (NAME);
	BEGIN
	PRINT 'THEOREM;
	PRINS(NAME);
	TERPRI();
	SHOWEXP(GET(NAME, 'THEOREM));
	END;


EVAL '(DEFPROP AXIOM SHOWAXIOM IMAGE);


EVAL '(DEFPROP PROOF SHOWPROOF IMAGE);


EVAL '(DEFPROP SCHEMA SHOWSCHEMA IMAGE);


EVAL '(DEFPROP THEOREM SHOWTHEOREM IMAGE);


EXPR SPECALL (FORM, ARGS);
	BEGIN
LOOP; 	IF NULL ARGS THEN RETURN FORM;
	IF ATOM FORM THEN ERREND('(ATOMIC EXPRESSION));
	IF FORM[1,1] NEQ 'FORALL & FORM[1,1] NEQ 'THEREEXISTS THEN ERREND('(NOT QUANTIFIED EXPRESSION));
	RETURN SPECALL(PROPSUBST(CAR ARGS, FORM[1,2], FORM[2]), CDR ARGS);
	END;


EXPR TH1 (A1, A2, A, C);
	IF NULL A THEN TH2(A1, A2, NIL, NIL, C)
	ELSE CAR A ε C | (
		IF ATOM CAR A THEN TH1(
			IF CAR A ε A1 THEN A1
			ELSE CAR A CONS A1, A2, CDR A, C)
		ELSE TH1(A1, 
			IF CAR A ε A2 THEN A2
			ELSE CAR A CONS A2, CDR A, C));


EXPR TH2 (A1, A2, C1, C2, C);
	IF NULL C THEN TH(A1, A2, C1, C2)
	ELSE IF ATOM CAR C THEN TH2(A1, A2, 
		IF CAR C ε C1 THEN C1
		ELSE CAR C CONS C1, C2, CDR C)
	ELSE TH2(A1, A2, C1, 
		IF CAR C ε C2 THEN C2
		ELSE CAR C CONS C2, CDR C);


EXPR TH (A1, A2, C1, C2);
	IF NULL A2 THEN ¬NULL C2 & THR(CAR C2, A1, A2, C1, CDR C2)
	ELSE THL(CAR A2, A1, CDR A2, C1, C2);


EXPR THL (U, A1, A2, C1, C2);
	IF CAR U = 'NOT THEN TH1R(U[2], A1, A2, C1, C2)
	ELSE IF CAR U = 'AND THEN TH2L(CDR BINAND(CDR U), A1, A2, C1, C2)
	ELSE IF CAR U = 'OR THEN 
		TH1L(BINOR(CDR U)[2], A1, A2, C1, C2) & TH1L(BINOR(CDR U)[3], A1, A2, C1, C2)
	ELSE IF CAR U = 'IMPLIES THEN TH1L(U[3], A1, A2, C1, C2) & TH1R(U[2], A1, A2, C1, C2)
	ELSE IF CAR U = 'EQUIVALENT THEN TH2L(CDR U, A1, A2, C1, C2) & TH2R(CDR U, A1, A2, C1, C2)
	ELSE IF U ε C1 THEN T
	ELSE TH(U CONS A1, A2, C1, C2);


EXPR THR (U, A1, A2, C1, C2);
	IF CAR U = 'NOT THEN TH1L(U[2], A1, A2, C1, C2)
	ELSE IF CAR U = 'AND THEN TH1R(U[2], A1, A2, C1, C2) & TH1R(U[3], A1, A2, C1, C2)
	ELSE IF CAR U = 'OR THEN TH2R(CDR U, A1, A2, C1, C2)
	ELSE IF CAR U = 'IMPLIES THEN TH11(CDR U, A1, A2, C1, C2)
	ELSE IF CAR U = 'EQUIVALENT THEN TH11(CDR U, A1, A2, C1, C2) & TH11(REVERSE CDR U, A1, A2, C1, C2)
	ELSE IF U ε A1 THEN T
	ELSE TH(A1, A2, U CONS C1, C2);


EXPR TH1L (V, A1, A2, C1, C2);
	IF ATOM V THEN V ε C1 | TH(V CONS A1, A2, C1, C2)
	ELSE V ε C2 | TH(A1, V CONS A2, C1, C2);


EXPR TH1R (V, A1, A2, C1, C2);
	IF ATOM V THEN V ε A1 | TH(A1, A2, V CONS C1, C2)
	ELSE V ε A2 | TH(A1, A2, C1, V CONS C2);


EXPR TH2L (V, A1, A2, C1, C2);
	IF ATOM CAR V THEN CAR V ε C1 | TH1L(V[2], CAR V CONS A1, A2, C1, C2)
	ELSE CAR V ε C2 | TH1L(V[2], A1, CAR V CONS A2, C1, C2);


EXPR TH2R (V, A1, A2, C1, C2);
	IF ATOM CAR V THEN CAR V ε A1 | TH1R(V[2], A1, A2, CAR V CONS C1, C2)
	ELSE CAR V ε A2 | TH1R(V[2], A1, A2, C1, CAR V CONS C2);


EXPR TH11 (V, A1, A2, C1, C2);
	IF ATOM CAR V THEN CAR V ε C1 | TH1R(V[2], CAR V CONS A1, A2, C1, C2)
	ELSE CAR V ε C2 | TH1R(V[2], A1, CAR V CONS A2, C1, C2);


EXPR UNGEN (WFF, ASS, FVAR, BVAR);
	BEGIN
	NEW TEM;
	IF FREEIN(FVAR, ASS) THEN ERREND('(VARIABLE FREE IN ASSUMPTIONS));
	IF USEDINEXISTSPEC(FVAR) THEN ERREND('(USED IN EXISTENTIALLY SPECIFIED LINE));
	TEM ← GENSYM();
	WFF ← SUBST(TEM, FVAR, WFF);
	IF BVAR ε ALLVARS(WFF) THEN ERREND('(VARIABLE CONFLICT));
	RETURN <<'FORALL, BVAR>, SUBST(BVAR, TEM, WFF)>;
	END;


EXPR UNION (SETS);
	IF NULL SETS THEN NIL
	ELSE IF NULL CDR SETS THEN CAR SETS
	ELSE UNION2(CAR SETS, UNION(CDR SETS));


EXPR UNION2 (SET1, SET2);
	IF NULL SET1 THEN SET2
	ELSE IF CAR SET1 ε SET2 THEN UNION2(CDR SET1, SET2)
	ELSE UNION2(CDR SET1, CAR SET1 CONS SET2);


EXPR USEDINEXISTSPEC (VAR);
	BEGIN
	NEW PRF;
	PRF ← CURTEXT();
LOOP; 	IF NULL PRF THEN RETURN NIL;
	IF PRF[1,3,1] = 'ES & VAR ε FREEVARS(PRF[1,2]) THEN RETURN T;
	PRF ← CDR PRF;
	GO LOOP;
	END;


EXPR USEDVAR (VAR);
	BEGIN
	NEW PRF;
	PRF ← CURTEXT();
LOOP; 	IF NULL PRF THEN RETURN NIL;
	IF VAR ε ALLVARS(PRF[1,2]) THEN RETURN T;
	PRF ← CDR PRF;
	GO LOOP;
	END;


EXPR VALID (PROP);
	PROP NEQ 'INVALID;


EXPR WFFLIST (L);
	MAPCAR(FUNCTION(WFFPART), L);


EXPR WFFPART (LINE);
	GETLINE(LINE)[2];


EXPR GETINFXNAM (ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                     );
	BEGIN
	NEW NAME;
	IF NUMBERP ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                        THEN RETURN ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                                        ;
	NAME ← SEEKPROP(ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                            , 'INFXNAM);
	IF ¬NULL NAME THEN RETURN NAME[2];
	RETURN ATOM
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  ATOM
                   ;
	END;


EXPR INFX (EXP);
	BEGIN
	INFXEXPR(EXP, 0, 0);
	INFXATOM('? );
	END;


EXPR INFXARGS (ARGS, LPREC, RPREC);
	IF NULL ARGS THEN 
		BEGIN
		INFXATOM('?();
		INFXATOM('?));
		END
	ELSE IF NULL CDR ARGS THEN 
		BEGIN
		INFXATOM('? );
		INFXEXPR(CAR ARGS, LPREC, RPREC);
		END
	ELSE INFXPARENED('?*COMMA?* CONS ARGS, LPREC, RPREC);


PUTPROP('INFXATOM, 'PRNTATOM, 'EXPR);


EXPR INFXCOND (S, L, R);
	BEGIN
	INFXATOM('IF);
	INFXATOM('? );
	INFXEXPR(S[2,1], 0, 0);
	INFXATOM('? );
	INFXATOM('THEN);
	INFXATOM('? );
	INFXEXPR(S[2,2], 0, 0);
	INFXATOM('? );
	IF NULL CDDR S THEN RETURN NIL;
	INFXATOM('ELSE);
	INFXATOM('? );
	INFXEXPR(S[3,2], 0, 0);
	END;


EXPR INFXFUN (FN, LPREC, RPREC);
	IF ATOM FN THEN INFXATOM(FN)
	ELSE INFXPARENED(FN, LPREC, RPREC);


EXPR INFXEXPR (EXP, LPREC, RPREC);
	BEGIN
	NEW OP;
	IF ATOM EXP THEN RETURN INFXATOM(EXP);
	IF ¬ATOM CAR EXP THEN GO NOATM;
	OP ← GETGET(CAR EXP, 'INFXFUN);
	IF ¬NULL OP THEN RETURN APPLY(OP[2], <EXP, LPREC, RPREC>);
NOATM; 	INFXFUN(CAR EXP, LPREC, RPREC);
	INFXARGS(CDR EXP, 10000, RPREC);
	END;


EXPR INFXLIST (OP, ARGS, LPREC, RPREC);
	BEGIN
	NEW PREC;
	PREC ← GET(OP, 'PREC);
LOOP; 	IF NULL ARGS THEN RETURN NIL;
	INFXATOM(OP);
	INFXEXPR(CAR ARGS, PREC[2], 
		IF NULL CDR ARGS THEN RPREC
		ELSE CAR PREC);
	ARGS ← CDR ARGS;
	GO LOOP;
	END;


EXPR INFXOPER (EXP, LPREC, RPREC);
	BEGIN
	NEW PREC;
	PREC ← GET(CAR EXP, 'PREC);
	IF CAR PREC ?*LESS LPREC | PREC[2] ?*LESS RPREC THEN RETURN INFXPARENED(EXP, LPREC, RPREC);
	IF NULL CDR EXP THEN RETURN INFXATOM(CAR EXP);
	IF NULL CDDR EXP THEN RETURN INFXLIST(CAR EXP, CDR EXP, LPREC, RPREC);
	INFXEXPR(EXP[2], LPREC, CAR PREC);
	RETURN INFXLIST(CAR EXP, CDDR EXP, LPREC, RPREC);
	END;


EXPR INFXPARENED (EXP, LPREC, RPREC);
	BEGIN
	INFXATOM('?();
	INFXEXPR(EXP, 0, 0);
	INFXATOM('?));
	END;


EXPR INFXQUOTE (SEXPR, LPREC, RPREC);
	BEGIN
	INFXATOM('QUOTE);
	PRIN1 SEXPR[2];
	END;


EXPR INFXSPEC (SEXPR, LPREC, RPREC);
	LAMBDA (G0016); 
		G0016(SEXPR, LPREC, RPREC);
	(GET(CAR SEXPR, 'SPECOPER));


EXPR PRNTATOM (AT
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  AT
                 );
	BEGIN
	NEW NAM;
	NAM ← GETINFXNAM(AT
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  AT
                           );
	IF CHRCT() ?*LESS FLATSIZE NAM + 1 THEN TERPRI();
	PRINC NAM;
	END;


PUTPROP('PREC, 'INFXOPER, 'INFXFUN);


PUTPROP('SPECOPER, 'INFXSPEC, 'INFXFUN);


PUTPROP('COND, 'INFXCOND, 'SPECOPER);


PUTPROP('QUOTE, 'INFXQUOTE, 'SPECOPER);


EXPR FITSLINE (EXP, COL, PARS);
	BEGIN
	NEW ANS, EXPEXP, EXPLGTH, EXPLIM;
	IF ATOM EXP THEN RETURN T;
	EXPLGTH ← 0;
	EXPEXP ← EXP;
	EXPLIM ← LINELENGTH NIL - (COL + PARS);
	INITPROP('INFXATOM, 'LGTHATOM, 'EXPR);
	ANS ← EVAL '(ERRSET (INFXEXPR EXPEXP 1 0));
	DELETEPROP('INFXATOM, 'EXPR);
	RETURN ANS;
	END;


EXPR LGTHATOM (AT
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  AT
                 );
	BEGIN
	EXPLGTH ← EXPLGTH + FLATSIZE GETINFXNAM(AT
*** WARNING, MLISP PREFIX NOT USED AS A PREFIX:  AT
                                                  );
	IF LEQ(EXPLGTH, EXPLIM) THEN RETURN NIL;
	EXPLGTH ← NIL;
	ERR();
	END;


EXPR TDD (EXP);
	TDDEXP(EXP, 1, 0);


EXPR TDDARGS (ARGS, COL, PARS);
	IF ¬NULL ARGS & NULL CDR ARGS THEN 
		BEGIN
		PRINC '? ;
		TDDEXP(CAR ARGS, COL + 1, PARS);
		END
	ELSE 	BEGIN
		INFXATOM('?();
		TDDLIST(ARGS, COL + 1, PARS + 1);
		INFXATOM('?));
		END;


EXPR TDDEXP (EXP, COL, PARS);
	BEGIN
	NEW TEM;
	TABTO(COL);
	IF FITSLINE(EXP, COL, PARS) THEN RETURN INFXEXPR(EXP, 0, 0);
	TEM ← GETGET(CAR EXP, 'TDDFUN);
	IF ¬NULL TEM THEN RETURN APPLY(TEM[2], <EXP, COL, PARS>);
NOAT; 	TDDFUNC(CAR EXP, COL, PARS);
	TDDARGS(CDR EXP, CURCOL(), PARS);
	END;


EXPR TDDFUNC (EXP, COL, PARS);
	BEGIN
	IF ATOM EXP THEN RETURN INFXATOM(EXP);
	INFXATOM('?();
	TDDEXP(EXP, COL + 1, PARS + 1);
	INFXATOM('?));
	END;


EXPR TDDLIST (EXP, COL, PARS);
	BEGIN
LOOP; 	IF NULL EXP THEN RETURN NIL;
	TDDEXP(CAR EXP, COL, PARS + 1);
	EXP ← CDR EXP;
	IF ¬NULL EXP THEN INFXATOM('?,);
	GO LOOP;
	END;


EXPR TDDINFX (EXP, COL, PARS);
	BEGIN
	NEW ARGS, INCR, OP;
	IF NULL CDR EXP | NULL CDDR EXP THEN RETURN INFX(EXP);
	OP ← CAR EXP;
	INCR ← FLATSIZE GETINFXNAM(CAR EXP);
	TDDEXP(EXP[2], COL, PARS);
	ARGS ← CDDR EXP;
LOOP; 	IF NULL ARGS THEN RETURN NIL;
	TERPRI();
	TABTO(COL);
	INFXATOM(OP);
	TDDEXP(CAR ARGS, COL + INCR, PARS);
	ARGS ← CDR ARGS;
	GO LOOP;
	END;


PUTPROP('PREC, 'TDDINFX, 'TDDFUN);


EXPR ALLFIT (LIST, WIDTH, RPARS);
	BEGIN
	IF NULL LIST THEN RETURN T;
LOOP; 	IF NULL CDR LIST THEN RETURN LEQ(FLATSIZE CAR LIST, WIDTH - RPARS);
	IF FLATSIZE CAR LIST ?*GREAT WIDTH THEN RETURN NIL;
	LIST ← CDR LIST;
	GO LOOP;
	END;


EXPR PRINL (X);
	IF NULL X THEN NIL
	ELSE IF CHRCT() ?*LESS FLATSIZE CAR X + 2 THEN 
		BEGIN
		TERPRI();
		PRINC '?	;
		PRINL(X);
		END
	ELSE 	BEGIN
		PRINS(CAR X);
		PRINL(CDR X);
		END;


EXPR PRINS (X);
	BEGIN
	PRINC X;
	PRINC '? ;
	END;


EXPR PRINTEXPR (EXP);
	BEGIN
	PRINTSUBEXPR(EXP, 1, 0);
	TERPRI();
	TERPRI();
	END;


EXPR PRINTLIST (LIST, LMARG, RPARS);
	BEGIN
	PRINC '?(;
	PRINTMEMBERS(LIST, LMARG + 1, RPARS + 1);
	PRINC '?);
	END;


EXPR PRINTMEMBERS (LIST, LMARG, RPARS);
	BEGIN
LOOP; 	IF NULL LIST THEN RETURN NIL;
	IF ATOM LIST THEN RETURN (
		BEGIN
		PRINC '? ?.? ;
		PRIN1 LIST;
		END);
	PRINTSUBEXPR(CAR LIST, LMARG, 
		IF NULL CDR LIST THEN RPARS + 1
		ELSE IF ATOM CDR LIST THEN RPARS + 4
		ELSE 0);
	LIST ← CDR LIST;
	GO LOOP;
	END;


EXPR PRINTSUBEXPR (SEXPR, LMARG, RPARS);
	BEGIN
	NEW TEM;
	TABTO(LMARG);
	IF ATOM SEXPR THEN RETURN PRIN1 SEXPR;
	IF ATOM CAR SEXPR & ¬NUMBERP CAR SEXPR THEN TEM ← GETGET(CAR SEXPR, 'PPROP);
	IF ¬NULL TEM THEN RETURN (
		LAMBDA (G0017); 
			G0017(SEXPR, LMARG, RPARS);
		(TEM[2]));
	IF LEQ(FLATSIZE SEXPR, CHRCT() - RPARS) THEN RETURN PRIN1 SEXPR;
	IF LEQ(FLATSIZE CAR SEXPR, 4) | ALLFIT(CDR SEXPR, CHRCT() - (2 + FLATSIZE CAR SEXPR), RPARS) THEN 
		RETURN (BEGIN
			PRINC '?(;
			PRIN1 CAR SEXPR;
			PRINC '? ;
			PRINTMEMBERS(CDR SEXPR, CURCOL(), 1 + RPARS);
			PRINC '?);
			END);
	PRINTLIST(SEXPR, LMARG, RPARS);
	END;


EXPR PRINTN (CHAR, NUM);
	BEGIN
	NEW NO;
	NO ← 1;
LOOP; 	IF NUM ?*LESS NO THEN RETURN NUM;
	PRINC CHAR;
	NO ← NO + 1;
	GO LOOP;
	END;


EXPR PRINTNOCRFUN (SEXPR, LMARG, RPARS);
	BEGIN
	IF LEQ(FLATSIZE SEXPR, CHRCT() - RPARS) THEN RETURN PRIN1 SEXPR;
	PRINC '?(;
	PRIN1 CAR SEXPR;
	PRINC '? ;
	PRINC SEXPR[2];
	PRINTMEMBERS(CDDR SEXPR, LMARG + 1, RPARS + 1);
	PRINC '?);
	END;


EXPR TABTO (COLNO);
	BEGIN
	IF CURCOL() ?*GREAT COLNO THEN TERPRI();
	PRINTN('?	, LSH(COLNO - CURCOL(), MINUS 3));
	PRINTN('? , COLNO - CURCOL());
	END;


PUTPROP('NOCR, 'PRINTNOCRFUN, 'PPROP);


FLAG('(ADDAXIOM ADDSCHEMA ADDTHEOREM DEFPROP GIVEAX GIVEPROOF GIVESCHM MAKETHM SETQ USEAX USESCHM), 'NOCR);


PROG2(PRECLIS?* ← 'IMPLIES CONS PRECLIS?*, MKPREC());


PROG2(PRECLIS?* ← 'EQUIVALENT CONS PRECLIS?*, MKPREC());


PRECSET('CMAPS, 'LESSP);


PRECSET('CONTAINED, 'LESSP);


PRECSET('INTERSECTION, 'CONTAINED);


PRECSET('MAPS, 'INTERSECTION);


PRECSET('MEMBER, 'LESSP);


PRECSET('PRODUCT, 'INTERSECTION);


PRECSET('UNION, 'CONTAINED);


PUTPROP('?&, '(NIL AND NIL), 'SWITCH?*);


PUTPROP('?⊂, '(NIL CONTAINED NIL), 'SWITCH?*);


PUTPROP('?=, '(?> EQUAL IMPLIES), 'SWITCH?*);


PUTPROP('?≡, '(NIL EQUIVALENT NIL), 'SWITCH?*);


PUTPROP('?∀, '(NIL FORALL NIL), 'SWITCH?*);


PUTPROP('?≥, '(NIL GEQ NIL), 'SWITCH?*);


PUTPROP('?∩, '(NIL INTERSECTION NIL), 'SWITCH?*);


PUTPROP('?→, '(?→ MAPS CMAPS), 'SWITCH?*);


PUTPROP('?⊃, '(NIL IMPLIES NIL), 'SWITCH?*);


PUTPROP('?≤, '(NIL LEQ NIL), 'SWITCH?*);


PUTPROP('?ε, '(NIL MEMBER NIL), 'SWITCH?*);


PUTPROP('?≠, '(NIL NEQ NIL), 'SWITCH?*);


PUTPROP('?⊗, '(NIL PRODUCT NIL), 'SWITCH?*);


PUTPROP('?∃, '(NIL THEREEXISTS NIL), 'SWITCH?*);


PUTPROP('?∪, '(NIL UNION NIL), 'SWITCH?*);


PUTPROP('ALL, 'FORALL, 'NEWNAM);


PUTPROP('EXISTS, 'THEREEXISTS, 'NEWNAM);


PUTPROP('EQU, 'EQUIVALENT, 'NEWNAM);


PUTPROP('GREATEQ, 'GEQ, 'NEWNAM);


PUTPROP('IMP, 'IMPLIES, 'NEWNAM);


PUTPROP('LESSEQ, 'LEQ, 'NEWNAM);


PUTPROP('MEM, 'MEMBER, 'NEWNAM);


LETTER(3);


REMPROP('LAMBDA, 'STAT);


REMPROP('GO, 'STAT);


REMPROP('STEP, 'DELIM);


REMPROP('DO, 'DELIM);


REMPROP('MAP, 'NEWFORM);


REMPROP('MAPLIST, 'NEWFORM);


REMPROP('MAPCAR, 'NEWFORM);


REMPROP('EXPLODE, 'NEWNAM);


IGLIST?* ← '(9 10 12 13 32);


PUTPROP('EXPR, 'PROCDEF, 'STAT);


LOGICALCONSTANTS ← '(TRUE FALSE);


QUANTIFIERS ← '(FORALL LAMBDA THEREEXISTS);


DDWIDTH ← 84;


FILEWIDTH ← 69;


IIIWIDTH ← 88;


IMLACWIDTH ← 80;


TTYWIDTH ← 71;


END.